package main

import (
	"fmt"
	"sync"
	"sync/atomic"
	"time"
)

// 生产消费者模式的开始
// 设计模式介绍:可以让任务异步的进行，同时负载单任务的消耗量，同时提高CPU的利用率
// 使用场景，促销，大场景业务分层分离，架构设计等等
// 下面案例介绍
// produter 3个 customer 5个 生产者每秒生产10个商品，消费者3秒消费一个商品，如果没有商品的话就等待生产
// 当生产的数量大于50的时候就开始继续消费

type info struct {
	Shop int32
	Name string
}

func worker(ch <-chan *info) {
	for {
		select {
		case v := <-ch:
			fmt.Println(*v)
		default:
			time.Sleep(time.Second * 1)
			fmt.Println("消费者休息中....")
		}
	}
}

func produter(ch chan<- *info, p info) {

	var i int32
	i = 0
	for {
		atomic.StoreInt32(&p.Shop, i)
		p.Name = "product"
		ch <- &p
		i++
		time.Sleep(time.Millisecond * 1000)
	}
}
func main() {
	var wg sync.WaitGroup
	var ch = make(chan *info, 50)
	var p = info{}
	wg.Add(5)
	go worker(ch)
	go worker(ch)

	go produter(ch, p)
	go produter(ch, p)
	go produter(ch, p)

	wg.Wait()
}
